Nie można znaleźć pliku deklaracji dla modułu 'Nazwa modułu'. '/path / to / module-name.js"
Czytałem jak działa TypeScript Rozdzielczość modułu .
Mam następujące repozytorium: @ ts-stack / di . Po skompilowaniu struktura katalogów wygląda następująco:
├── dist
│ ├── annotations.d.ts
│ ├── annotations.js
│ ├── index.d.ts
│ ├── index.js
│ ├── injector.d.ts
│ ├── injector.js
│ ├── profiler.d.ts
│ ├── profiler.js
│ ├── providers.d.ts
│ ├── providers.js
│ ├── util.d.ts
│ └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
│ ├── annotations.ts
│ ├── index.ts
│ ├── injector.ts
│ ├── profiler.ts
│ ├── providers.ts
│ └── util.ts
└── tsconfig.json
W mojej paczce.json I wrote "main": "dist/index.js"
.
W Węźle.js wszystko działa dobrze, ale maszynopis:
import {Injector} from '@ts-stack/di';
Nie można znaleźć pliku deklaracji dla modułu '@ ts-stack / di'. '/path / to/node_modules / @ ts-stack/di/dist / index.js "implicite ma "any" Typ.
A jednak, jeśli importuję w następujący sposób, to wszystko działa:
import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
Co robię źle? 16 answers
Oto dwa inne rozwiązania
Gdy moduł nie jest Twój-spróbuj zainstalować typy z @types
:
npm install -D @types/module-name
Jeśli powyższe błędy instalacji-spróbuj zmienić import
na require
:
// import * as yourModuleName from 'module-name';
const yourModuleName = require('module-name');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-17 17:02:40
Jeśli importujesz zewnętrzny moduł 'foo'
, który nie zawiera żadnych typowań, ani w samej bibliotece, ani w pakiecie @types/foo
(wygenerowanym z repozytorium DefinitelyTyped ), możesz usunąć ten błąd, deklarując moduł w pliku z rozszerzeniem .d.ts
. TypeScript szuka plików .d.ts
w tych samych miejscach, w których będzie szukał zwykłych plików .ts
: jak określono w "files", "include" I "exclude" w tsconfig.json
.
// foo.d.ts
declare module 'foo';
Then when you import foo
zostanie wpisany jako any
.
Alternatywnie, jeśli chcesz rzucić własne typy, możesz to zrobić również:
// foo.d.ts
declare module 'foo' {
export function getRandomNumber(): number
}
To będzie poprawnie skompilowane:
import { getRandomNumber } from 'foo';
const x = getRandomNumber(); // x is inferred as number
Nie musisz podawać pełnych typowań dla modułu, wystarczy dla bitów, których faktycznie używasz( i dla których chcesz poprawnie pisać), więc jest to szczególnie łatwe, jeśli używasz dość małej ilości API.
Z drugiej strony, jeśli nie zależy ci na typowanie bibliotek zewnętrznych i chcesz, aby wszystkie biblioteki bez typowania były importowane jako any
, możesz dodać to do pliku z rozszerzeniem .d.ts
:
declare module '*';
Zaletą (i minusem) tego jest to, że możesz zaimportować absolutnie wszystko, a TS się skompiluje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-16 21:29:45
Jeśli potrzebujesz szybkiej poprawki, po prostu dodaj ją przed wierszem importu:
// @ts-ignore
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-05 12:04:28
To uczucie, gdy patrzysz przez dwa dni i znajdujesz je w ten sposób: po prostu usuń .js
z "main": "dist/index.js"
w package.json
i wszystko działa dobrze!
"main": "dist/index",
UPD : ta odpowiedź jest względna, jeśli masz własny pakiet npm, jeśli nie - zobacz moją odpowiedź poniżej .
I jeśli powyższa odpowiedź nie została rozwiązana zaimportuj swój moduł, spróbuj po prostu dodać typings
W package.json
:
"main": "dist/index",
"typings": "dist/index",
Oczywiście, tutaj folder dist
- to miejsce, w którym przechowywane są pliki twojego modułu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:45
TypeScript to w zasadzie implementacja reguł i dodawanie typów do kodu, aby uczynić go bardziej przejrzystym i dokładniejszym ze względu na brak ograniczeń w Javascript. TypeScript wymaga opisania danych, aby kompilator mógł sprawdzić kod i znaleźć błędy. Kompilator poinformuje cię, jeśli używasz typów niedopasowanych, jeśli nie masz zakresu lub próbujesz zwrócić inny typ.
Tak więc, gdy używasz zewnętrznych bibliotek i modułów z maszynopisem, muszą one zawierać pliki opisujące typy w tym kodzie. Pliki te nazywane są plikami deklaracji typu z rozszerzeniem d.ts
. Większość typów deklaracji dla modułów npm jest już zapisana i można je załączyć za pomocą npm install @types/module_name
(gdzie module_name jest nazwą modułu, którego typy chcesz załączyć).
Istnieją jednak moduły, które nie mają definicji typu i aby usunąć błąd i zaimportować moduł za pomocą import * as module_name from 'module-name'
, Utwórz folder typings
w katalogu głównym Twój projekt, wewnątrz utwórz nowy folder z nazwą modułu i w tym folderze Utwórz plik module_name.d.ts
i zapisz declare module 'module_name'
. Następnie przejdź do pliku tsconfig.json
i dodaj "typeRoots": [ "../../typings", "../../node_modules/@types"]
w compilerOptions
(z odpowiednią ścieżką względną do folderów), aby TypeScript wiedział, gdzie może znaleźć definicje typów bibliotek i modułów i dodać nową właściwość "exclude": ["../../node_modules", "../../typings"]
do pliku.
Oto przykład twojego tsconfig.plik json powinien wyglądać następująco:
{
"compilerOptions": {
"module": "commonjs",
"noImplicitAny": true,
"sourceMap": true,
"outDir": "../dst/",
"target": "ESNEXT",
"typeRoots": [
"../../typings",
"../../node_modules/@types"
]
},
"lib": [
"es2016"
],
"exclude": [
"../../node_modules",
"../../typings"
]
}
Robiąc to, błąd zniknie i będziesz mógł trzymać się najnowszych reguł ES6 i maszynopisu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 09:17:16
Jeśli ktoś jeszcze to czyta, spróbuj zmienić nazwę swojego .plik js do .ts
Edytuj:
Możesz również dodać "allowJs": true
do pliku tsconfig.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-07 11:00:55
Ten sposób działa dla mnie:
1. dodaj własną deklarację do pliku deklaracji, takiego jak index.d. ts (może pod korzeniem projektu)declare module 'Injector';
2. dodaj swój indeks.d. ts do tsconfig.json
{
"compilerOptions": {
"strictNullChecks": true,
"moduleResolution": "node",
"jsx": "react",
"noUnusedParameters": true,
"noUnusedLocals": true,
"allowSyntheticDefaultImports":true,
"target": "es5",
"module": "ES2015",
"declaration": true,
"outDir": "./lib",
"noImplicitAny": true,
"importHelpers": true
},
"include": [
"src/**/*",
"index.d.ts", // declaration file path
],
"compileOnSave": false
}
-- edit: potrzebne cudzysłowy wokół nazwy modułu
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-19 07:39:23
Miałem ten sam problem przy użyciu modułu węzła z aplikacją reactową napisaną maszynopisem. Moduł został pomyślnie zainstalowany przy użyciu npm i --save my-module
.
Jest napisany w javascript i eksportuje klasę Client
.
Z:
import * as MyModule from 'my-module';
let client: MyModule.Client = new MyModule.Client();
Kompilacja nie powiodła się z błędem:
Could not find a declaration file for module 'my-module'.
'[...]/node_modules/my-module/lib/index.js' implicitly has an 'any' type.
Try `npm install @types/my-module` if it exists or add a new declaration (.d.ts) file containing `declare module 'my-module';`
@types/my-module
nie istnieje, więc dodałem plik my-module.d.ts
obok tego, do którego importowany jest my-module
, z sugerowaną linią. Potem dostałem błąd:
Namespace '"my-module"' has no exported member 'Client'.
Klient jest faktycznie eksportowany i działa Normalnie, jeśli używam go w aplikacji js. Również poprzedni komunikat mówi mi, że kompilator szuka w odpowiednim pliku ({[9] } jest zdefiniowany w my-module/package.json
"main"
element).
Rozwiązałem problem mówiąc kompilatorowi, że nie dbam o implicit any
, czyli ustawiłem na false
następujący wiersz pliku tsconfig.json
:
"noImplicitAny": false,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-25 14:45:02
Musisz edytować plik konfiguracyjny maszynopisu (tsconfig.json) i dodać nową parę klucz-wartość jako:
"noImplicitAny": false
Na Przykład: "noImplicitAny": false, "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, Kontynuuj....
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-01 16:32:11
Niestety nie mamy wpływu na to, czy autor pakietu będzie przeszkadzał z plikiem deklaracji. Zazwyczaj mam taki plik index.d.ts
, który będzie zawierał wszystkie brakujące pliki deklaracji z różnych pakietów:
Indeks.ts:
declare module 'v-tooltip';
declare module 'parse5';
declare module 'emoji-mart-vue-fast';
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-19 16:12:37
Próbowałem wszystkiego tutaj, ale dla mnie to był zupełnie inny problem:
Musiałem usunąć z mojego *.d.ts
wszelkie polecenia importu:
import { SomeModuleType } from '3rd-party-module';
Po usunięciu błędu zniknął...
Wyjaśnienie :
Kiedy deklarujemy moduł w pliku *.d.ts
, jest on automatycznie pobierany przez kompilator maszynopisu jako moduł ambient (ten, którego nie trzeba importować jawnie). Po określeniu import ... from ...
, Plik staje się teraz normalnym modułem (ES6), a zatem nie będzie odebrany automatycznie. Dlatego jeśli nadal chcesz, aby zachowywał się jak moduł ambient, użyj innego stylu importu, jak tak:
type MyType: import('3rd-party-module').SomeModuleType;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-17 05:08:44
Sprawdź w pliku "tsconfig.json"
opcje kompilacji "include"
i "exclude"
. Jeśli nie istnieje, po prostu dodaj je informując swój korzeń katalog.
// tsconfig.json
{
"compilerOptions": {
...
"include": [
"src",
],
"exclude": [
"node_modules",
]
}
Rozwiązałem swój głupi problem po prostu usuwając instrukcję rozszerzenia "*.spec.ts"
z "exclude"
, ponieważ przy włączaniu "import"
w tych plikach zawsze pojawiały się problemy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-27 17:08:39
Ja też to dostawałem, przez jakiś czas byłem zdumiony, nawet z modułem i typami już zainstalowanymi i wielokrotnie przeładowywałem moje IDE.
To, co naprawiłem w moim przypadku, to kończenie procesów terminalowych, usuwanie node_modules
, czyszczenie pamięci podręcznej menedżera pakietów węzłów i robienie świeżego install
, a następnie ponowne ładowanie edytora.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-23 14:24:10
Proste do naprawienia jest re:
// example.d.ts
declare module 'foo';
Jeśli chcesz zadeklarować interfejs obiektu (polecam dla dużego projektu) możesz użyć :
// example.d.ts
declare module 'foo'{
// example
export function getName(): string
}
Jak tego użyć? proste..
const x = require('foo') // or import x from 'foo'
x.getName() // intellisense can read this
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-21 14:18:33
Could not find a declaration file for module 'busboy'. 'f:/firebase-cloud-
functions/functions/node_modules/busboy/lib/main.js' implicitly has an ‘any’
type.
Try `npm install @types/busboy` if it exists or add a new declaration (.d.ts)
the file containing `declare module 'busboy';`
W moim przypadku jest to rozwiązane: wystarczy edytować plik konfiguracyjny maszynopisu (tsconfig.json
) i dodać nową parę klucz-wartość jako:
"noImplicitAny": false
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-10 14:53:58
Po prostu możesz zaimportować go za pomocą require jako następujący kod:
var _ = require('your_module_name');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-13 17:04:48